package service

import (
	"douyin/models"
	"douyin/repository/mysql"
	"errors"

	"go.uber.org/zap"
	"golang.org/x/sync/errgroup"
)

// RelationAction 关系操作，关注或取关
func RelationAction(toUserId int64, actionType int32, userId int64) (err error) {
	g := new(errgroup.Group) //创建等待组
	//1. 关注
	if actionType == 1 {
		// TODO 关注修改
		//自己不能关注自己
		if toUserId == userId {
			return errors.New("关注失败")
		}
		//关注操作
		// TODO 数据库层面有数据不一致的问题存在（操作和变量维护应该当成事务提交到数据库）
		g.Go(func() error {
			if err := mysql.Follow(toUserId, userId); err != nil {
				return err
			}
			return nil
		})
		//维护变量follow_count
		g.Go(func() error {
			//toUserId的粉丝+1，userId的关注+1
			if err := mysql.RelationCount(toUserId, userId, true); err != nil {
				return err
			}
			return nil
		})
		if err = g.Wait(); err != nil {
			zap.L().Error("service.RelationAction Follow failed", zap.Error(err))
			return err
		}
	}
	//2. 取关
	if actionType == 2 {
		//取关操作
		g.Go(func() error {
			if err := mysql.UnFollow(toUserId, userId); err != nil {
				return err
			}
			return nil
		})
		//维护变量follow_count
		g.Go(func() error {
			//toUserId的粉丝-1，userId的关注-1
			if err := mysql.RelationCount(toUserId, userId, false); err != nil {
				return err
			}
			return nil
		})
		if err = g.Wait(); err != nil {
			zap.L().Error("service.RelationAction UnFollow failed", zap.Error(err))
			return err
		}
	}
	return
}

// FollowList 用户关注列表,userId是登录用户，otherId是要看的人
func FollowList(userId, otherId int64) (followList []models.User, err error) {
	//1.在relation表中，通过follow=otherId 查找be_follow的ids[]
	followIds, err := mysql.SelectFollowList(otherId)
	if err != nil {
		zap.L().Error("mysql.SelectFollowList failed", zap.Error(err))
		return
	}
	//2.组合结果
	followList, err = mysql.CombiFollow(followIds, userId)
	if err != nil {
		zap.L().Error("mysql.CombiRelation failed", zap.Error(err))
		return
	}
	return
}

// FollowerList 用户粉丝列表
func FollowerList(userId, otherId int64) (followerList []models.User, err error) {
	//1.在relation表中，通过be_follow=otherId 查找follow的ids[]
	followerIds, err := mysql.SelectFollowerList(otherId)
	if err != nil {
		zap.L().Error("mysql.SelectFollowerList failed", zap.Error(err))
		return
	}
	//2.组合结果
	followerList, err = mysql.CombiFollower(followerIds, userId)
	if err != nil {
		zap.L().Error("mysql.CombiRelation failed", zap.Error(err))
		return
	}
	return
}
